RoR_chapter7 機能を追加してみよう
気になるものだけ。
7-5 ファイルをアップロードしてモデルに添付する
Active Storage
gemの一種。railsのバージョンによっては同梱されている。
s3とかファイルの配置場所を操作するもの。
準備するコマンドを打つ
マイグレーションファイルが作成される。
添付されたファイルのサイズや名称、content-typeなどを管理するテーブルと
上記のテーブルとアプリ内のモデルの紐付けを管理するテーブル
これはUsersに画像を追加したいなら、Usersとファイル名称などを紐づける中間テーブルの役割
ファイルを管理する場所の設定
config/environments/development.rbとかにある(本番ならproduction.rb)
code:rb
# Store uploaded files on the local file system (see config/storage.yml for options)
config.active_storage.service = :local
このコメントの先のファイルを見に行く
see config/storage.yml for options)
code:config/storage.yml
local:
service: Disk
root: <%= Rails.root.join("storage") %>
localという設定
デフォルトのファイル管理場所
railsアプリが配置されたディレクトリの、storageディレクトリにファイルを格納するということ
Tasksに画像添付できるようにする
モデル記述
has_one_attached :image
1つのtask二は1つの画像を紐づけること
ビュー追加
edit
ja.ymlに:カラムの名称がどう呼ばれるかという定義の追加
f.labelとf.file_fieldの定義
今回は:imageというカラム名称を前提とするので、:imageとどちらも付与しておく。
show
code:slim
tr
th= Task.human_attribute_name(:image)
td= image_tag @task.image if @task.image.attached?
image_tagに@task.imageを渡す
ただしimage_tagは画像が添付されていないとエラーになるので、attached?で画像がある場合だけimage_tagを動作させるようにする
Strong Parameterの許可
app/controllers/tasks_controller.rbで許可を追加する。
これで完成。初めに書いたようにActive Recordを使う場合は、
画像にpathや名称など全て初めにマイグレーションしたテーブルで管理してくれる。
そのためTasksモデルに対して画像についてのカラムを定義する必要がない。